package com.sxd.bill.rela.extractor;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import com.sxd.bill.common.enums.LabelNameEnum;
import com.sxd.bill.common.item.LabelItem;
import com.sxd.bill.common.item.TextLabelItem;

public class MultiAmtExtractor extends IntegrateExtractor {
    public MultiAmtExtractor() {
        super(LabelNameEnum.AMOUNT);
    }

    @Override
    protected boolean checkCondition(TextLabelItem textLabelItem) {
        String text = textLabelItem.getText();
        boolean condtion = Pattern.compile("单张\\s*\\d+").matcher(text).find();
        return super.checkCondition(textLabelItem) && condtion;

    }

    @Override
    protected TextLabelItem preprocessing(TextLabelItem textLabelItem) {
        // 取出所有金额
        List<String> amts = textLabelItem.getLabelItems()
                .stream()
                .filter(item -> item.getLabelName().equals(this.multiValLabel))
                .map(item -> item.getLabelEntity())
                .collect(Collectors.toList());
        // 寻找出现在 “单张 xxx” 模式中的金额
        String exp = String.join("|", amts);
        String amtExp = String.format("单张\\s*(%s)", exp);
        String text = textLabelItem.getText();
        Matcher matcher = Pattern.compile(amtExp).matcher(text);
        List<String> newAmts = new ArrayList<String>();
        while (matcher.find()) {
            newAmts.add(matcher.group(1));
        }
        // 去掉出现在 “单张 xxx” 模式中的金额
        List<LabelItem> labelItems = textLabelItem.getLabelItems()
                .stream()
                .filter(label -> !newAmts.contains(label.getLabelEntity()))
                .collect(Collectors.toList());
        if (labelItems.isEmpty()) {
            // 如果为空，说明“单张xxx”模式中的金额与其他的金额一样, 则不处理，返回原来的textLabelItem;
            return textLabelItem;
        } else {
            // 不为空，则将其赋给克隆后的textLabelItem对象并返回
            TextLabelItem newTextLabelItem = textLabelItem.clone();
            newTextLabelItem.setLabelItems(labelItems);
            return newTextLabelItem;
        }
    }

}
